#pragma once
#include <iostream>
#include "Comm.hpp"

class Init
{
public:
    Init()
    {
        //指定权限掩码
        umask(0);
        //创建命名管道
        int n = mkfifo(gpipeFile.c_str(), gmode);
        if (n < 0)
        {
            cerr << "mkfifo error" << endl;
            return;
        }
        cout << "mkfifo success" << endl;
        //sleep(6);
    }

    ~Init()
    {
        int n = ::unlink(gpipeFile.c_str());
        if (n < 0)
        {
            cerr << "unlink error" << endl;
            return;
        }
        cout << "unlink success" << endl;
    }

private:
};

Init init;

class Server
{
public:
    Server()
        : _fd(gdefaultFd)
    {}

    //打开管道
    bool OpenPipeForRead()
    {
        //指定服务端读取文件 打开文件以只读方式
        _fd = OpenPipe(gForRead);
        if (_fd < 0)
        {
            return false;
        }
        return true;
    }

    //技巧：
    //string *:输出型参数
    //const string &:输入型参数
    //string &:输入输出型参数
    //读取管道
    int RecvPipe(string* out)
    {
        char buffer[gsize];
        //ssize_t 是 long int 类型
        //读取数据要预留一个空间 因为C字符串最后一个是'\0'
        ssize_t n = ::read(_fd, buffer, sizeof(buffer) - 1);
        if (n > 0)
        {
            //设置最后一个字符
            buffer[n] = 0; 
            *out = buffer;
        }
        return n;
    }

    //关闭管道
    void ClosePipe()
    {
        if (_fd >= 0)
            ::close(_fd);
    }

    ~Server()
    {}
    
private:
    //只需要有一个成员属性就是对应的文件描述符
    int _fd;
};
